home *** CD-ROM | disk | FTP | other *** search
- /*
- * dr.c
- *
- * drawing routines
- */
-
- #include "abc.h"
- #include "quickdraw.h"
- #include "windowMgr.h"
-
- struct shapes
- {
- short kind;
- Rect size;
- short oper;
- };
-
-
- struct shapes shapa[20];
- short shapdx;
-
-
- fr_line(startpt,endpt)
- Point startpt,endpt;
- {
- MoveTo(startpt.h,startpt.v);
- LineTo(endpt.h,endpt.v);
- }
-
- fr_rect(startpt,endpt)
- Point startpt,endpt;
- {
- Rect rt;
-
- Pt2Rect(startpt,endpt,&rt);
- FrameRect(&rt);
- }
-
- fr_oval(startpt,endpt)
- Point startpt,endpt;
- {
- Rect rt;
-
- Pt2Rect(startpt,endpt,&rt);
- FrameOval(&rt);
- }
-
- fr_rort(startpt,endpt)
- Point startpt,endpt;
- {
- Rect rt;
-
- Pt2Rect(startpt,endpt,&rt);
- FrameRoundRect(&rt,20,20);
- }
-
-
- fr_arc(startpt,endpt)
- Point startpt,endpt;
- {
- Rect rt;
- Rect trt;
- short sa;
- short aa;
-
- Pt2Rect(startpt,endpt,&rt);
- cp_arc(&rt,&trt,&sa,&aa);
- FrameArc (&trt,sa,aa);
- }
-
- cp_arc(irt,ort,startangle,arcangle)
- Rect *irt;
- Rect *ort;
- short *startangle;
- short *arcangle;
- {
- short dh;
- short dv;
- static Point anchor;
-
- dh = irt->right - irt->left;
- dv = irt->bottom - irt->top;
- if (not (dh | dv))
- {
- anchor.v = irt->top;
- anchor.h = irt->left;
- }
- *ort = *irt;
-
- if (irt->left equals anchor.h)
- if (irt->top < anchor.v)
- {
- ort->left -= dh;
- ort->top -= dv;
- *startangle = 180;
- *arcangle = -90;
- }
- else
- {
- ort->left -= dh;
- ort->bottom += dv;
- *startangle = 0;
- *arcangle = 90;
- }
- else
- if (irt->top < anchor.v)
- {
- ort->top -= dv;
- ort->right += dh;
- *startangle = 180;
- *arcangle = 90;
- }
- else
- {
- ort->right += dh;
- ort->bottom += dv;
- *startangle = 0;
- *arcangle = - 90;
- }
- }
-
- er_line(startpt,endpt)
- Point startpt,endpt;
- {
- GrafPtr gp;
- Pattern tpat;
-
- GetPort(&gp);
- BlockMove(gp->pnPat,&tpat,8);
- PenPat(gp->bkPat);
- MoveTo(startpt.h,startpt.v);
- LineTo(endpt.h,endpt.v);
- PenPat(&tpat);
- }
-
- er_rect(startpt,endpt)
- Point startpt,endpt;
- {
- Rect rt;
- Pt2Rect(startpt,endpt,&rt);
- EraseRect(&rt);
- }
-
- er_oval(startpt,endpt)
- Point startpt,endpt;
- {
- Rect rt;
-
- Pt2Rect(startpt,endpt,&rt);
- EraseOval(&rt);
- }
-
- er_rort(startpt,endpt)
- Point startpt,endpt;
- {
- Rect rt;
-
- Pt2Rect(startpt,endpt,&rt);
- EraseRoundRect(&rt,20,20);
- }
-
- er_arc(startpt,endpt)
- Point startpt,endpt;
- {
- Rect rt;
- Rect trt;
- short sa;
- short aa;
-
- Pt2Rect(startpt,endpt,&rt);
- cp_arc(&rt,&trt,&sa,&aa);
- EraseArc (&trt,sa,aa);
- }
-
-
- pt_line(startpt,endpt)
- Point startpt,endpt;
- {
- GrafPtr gp;
- Pattern tpat;
-
- MoveTo(startpt.h,startpt.v);
- LineTo(endpt.h,endpt.v);
- }
-
- pt_rect(startpt,endpt)
- Point startpt,endpt;
- {
- Rect rt;
-
- Pt2Rect(startpt,endpt,&rt);
- PaintRect(&rt);
- }
-
- pt_oval(startpt,endpt)
- Point startpt,endpt;
- {
- Rect rt;
-
- Pt2Rect(startpt,endpt,&rt);
- PaintOval(&rt);
- }
-
- pt_rort(startpt,endpt)
- Point startpt,endpt;
- {
- Rect rt;
-
- Pt2Rect(startpt,endpt,&rt);
- PaintRoundRect(&rt,20,20);
- }
-
-
- pt_arc(startpt,endpt)
- Point startpt,endpt;
- {
- Rect rt;
- Rect trt;
- short sa;
- short aa;
-
- Pt2Rect(startpt,endpt,&rt);
- cp_arc(&rt,&trt,&sa,&aa);
- PaintArc (&trt,sa,aa);
- }
-
-
- in_line(startpt,endpt)
- Point startpt,endpt;
- {
- GrafPtr gp;
- short tpnMode;
-
- GetPort(&gp);
- tpnMode = gp->pnMode;
- PenMode(patXor);
- MoveTo(startpt.h,startpt.v);
- LineTo(endpt.h,endpt.v);
- PenMode(tpnMode);
- }
-
- in_rect(startpt,endpt)
- Point startpt,endpt;
- {
- Rect rt;
-
- Pt2Rect(startpt,endpt,&rt);
- InvertRect(&rt);
- }
-
- in_oval(startpt,endpt)
- Point startpt,endpt;
- {
- Rect rt;
-
- Pt2Rect(startpt,endpt,&rt);
- InvertOval(&rt);
- }
-
- in_rort(startpt,endpt)
- Point startpt,endpt;
- {
- Rect rt;
-
- Pt2Rect(startpt,endpt,&rt);
- InvertRoundRect(&rt,20,20);
- }
-
- in_arc(startpt,endpt)
- Point startpt,endpt;
- {
- Rect rt;
- Rect trt;
- short sa;
- short aa;
-
- Pt2Rect(startpt,endpt,&rt);
- cp_arc(&rt,&trt,&sa,&aa);
- InvertArc (&trt,sa,aa);
- }
-
-
- typedef short (*drfunc)();
-
- drfunc a[][5] = {fr_line,fr_rect,fr_oval,fr_rort,fr_arc,
- pt_line,pt_rect,pt_oval,pt_rort,pt_arc,
- er_line,er_rect,er_oval,er_rort,er_arc,
- in_line,in_rect,in_oval,in_rort,in_arc};
-
-
- drinit()
- {
- short i;
-
- for (i = 0; i < 20; shapa[i++].kind = 0)
- ;
- shapdx = 0;
-
- }
-
- drshape(code)
- short code;
- {
- shapa[shapdx].kind = code;
- }
-
- droper(code)
- short code;
- {
- shapa[shapdx].oper = code;
- }
-
- drsize(r)
- Rect *r;
- {
- shapa[shapdx].size = *r;
- }
-
- drdraw(w)
- WindowRecord *w;
- {
- Point startpt;
- Point thispt;
- Point endpt;
- Point lastpt;
- Rect thisrt;
- Rect lastrt;
- GrafPtr port;
- drfunc frame;
- drfunc draw;
- short angle;
- short dv,dh;
- Point sp;
- Point tp;
- Point lp;
- short shapx;
- short operx;
-
- SetPort((GrafPtr)w);
- GetMouse(&startpt);
- lastpt = startpt;
- PenMode(patXor);
- PenPat(gray);
- shapx = shapa[shapdx].kind - 1;
- operx = shapa[shapdx].oper - 1;
- if ((shapx < 0) or (operx < 0)) /* to prevent trying */
- return; /* to use unselected items */
- frame = a[0][shapx]; /* get address of frame func */
- draw = a[operx][shapx]; /* get address of shape/oper func */
- do {
- GetMouse(&endpt);
- thispt = endpt;
- LocalToGlobal(&endpt);
- if (PtInRgn(endpt,w->contRgn) and
- not EqualPt(thispt,lastpt))
- {
- (*frame)(startpt,lastpt);
- (*frame)(startpt,thispt);
- lastpt = thispt;
- }
- }
- while (StillDown());
- (*frame)(startpt,thispt);
- PenMode(patCopy);
- PenPat(black);
- (*draw)(startpt,thispt);
- }
-
-
- abs(num)
- short num;
- {
- if (num < 0 )
- return -num;
- return num;
- /* num < 0 ? return -num : return num ;*/
- }